//1.块级作用域
/**
 * 如果在代码块 {...} 内声明了一个变量，那么这个变量只在该代码块内可见
 */
// {
//     let message="hello world";
//     console.info(message); //=>hello world
// }
// console.info(message);  //=>message is not defined

/**
 * 使用它来隔离一段代码，该段代码执行自己的任务，并使用仅属于自己的变量
 */
// {
//     let message="hello";
//     console.info(message);  //=>hello
// }

// {
//     let message="goodbye";
//     console.info(message);  //=>goodbye
// }

/**
 * 如果我们使用 let 对已存在的变量进行重复声明，如果对应的变量没有单独的代码块，则会出现错误
 */
// {
//     let message="hello";
//     console.info(message);  
//     let message="goodbye";//Identifier 'message' has already been declared
//     console.info(message);  
// }

/**
 * 对于 if，for 和 while 等，在 {...} 中声明的变量也仅在内部可见
 */
// if(1){
//     let message="hello";
//     console.info(message);  //=>hello
// }
// console.info(message);  //=>message is not defined


//2.嵌套函数
// function sayHiBye(firname,lastname) {
//     function getFullName() {
//         return firname+" "+lastname;
//     }
//     console.info("hi "+getFullName());
//     console.info("bye "+getFullName());
// }
// sayHiBye("tom" ,"li");


function makeCounter() {
    let count = 0;
    return function() {
      console.info( count++)
    };
  }
  
  let counter = makeCounter();
  
  counter(); // 0
  counter(); // 1
  counter(); // 2



  //3.词法环境
  